পয়েন্টার (Pointer) হলো এক ধরনের ভ্যারিয়েবল, যা অন্য একটি ভ্যারিয়েবলের মেমোরি অ্যাড্রেস ধারণ করে। সহজ কথায়, একটি পয়েন্টার একটি মেমোরি লোকেশনের ঠিকানা সংরক্ষণ করে এবং সেই মেমোরি লোকেশনের মানে অ্যাক্সেস করতে সাহায্য করে। পয়েন্টার C++ এর মতো ভাষায় একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা প্রোগ্রামারদের মেমোরি নিয়ে আরও উন্নত নিয়ন্ত্রণ প্রদান করে।
১. মেমোরি ব্যবস্থাপনা: পয়েন্টার প্রোগ্রামারদের সরাসরি মেমোরির ঠিকানা ব্যবহারের সুযোগ দেয়, যা মেমোরি ব্যবস্থাপনায় কার্যকর।
২. ডাইনামিক মেমোরি এলোকেশন: পয়েন্টারের মাধ্যমে প্রোগ্রাম চলাকালীন ডাইনামিক্যালি মেমোরি বরাদ্দ (allocate) এবং মুক্ত (deallocate) করা যায়। এই বৈশিষ্ট্যটি বিশেষ করে বড় প্রোগ্রাম এবং গেম ডেভেলপমেন্টে গুরুত্বপূর্ণ।
৩. ডেটা শেয়ারিং ও কার্যকারিতা বৃদ্ধি: পয়েন্টারের মাধ্যমে ভ্যারিয়েবলের রেফারেন্স পাঠানো যায়, যা পাস-বাই-ভ্যালুর তুলনায় মেমোরি সাশ্রয়ী। বড় ডেটা পাস করতে পয়েন্টার ব্যবহার করা দ্রুত এবং কার্যকরী।
৪. অ্যারে ও স্ট্রিং পরিচালনা: পয়েন্টার দিয়ে অ্যারে ও স্ট্রিং পরিচালনা করা যায়, যা বিভিন্ন ডেটা ম্যানিপুলেশনে সহায়ক।
৫. ডেটা স্ট্রাকচার ও লিংকড লিস্ট: পয়েন্টার ব্যবহার করে লিংকড লিস্ট, স্ট্যাক, কিউ, এবং অন্যান্য ডেটা স্ট্রাকচার তৈরি করা যায়, যা জটিল ডেটা ম্যানেজমেন্টে সহায়ক।
পয়েন্টার ঘোষণা করার জন্য ভ্যারিয়েবলের টাইপের সাথে *
চিহ্ন ব্যবহার করা হয়। পয়েন্টার ঘোষণা করার সময় ভ্যারিয়েবলের টাইপ অনুযায়ী টাইপ নির্ধারণ করতে হয়, কারণ পয়েন্টারটির মাধ্যমে মেমোরি লোকেশনের মান অ্যাক্সেস করা হয়।
data_type *pointer_name;
উদাহরণ:
int *ptr; // একটি পূর্ণসংখ্যার পয়েন্টার
#include <iostream>
using namespace std;
int main() {
int number = 50; // একটি সাধারণ ভ্যারিয়েবল
int *ptr = &number; // number এর ঠিকানা ptr এ সংরক্ষণ করা হলো
cout << "Value of number: " << number << endl;
cout << "Address of number: " << &number << endl;
cout << "Value of ptr (Address of number): " << ptr << endl;
cout << "Dereferenced value of ptr: " << *ptr << endl;
return 0;
}
বর্ণনা:
number
নামের একটি সাধারণ ভ্যারিয়েবল আছে যার মান ৫০। ptr
নামের একটি পয়েন্টার ভ্যারিয়েবল তৈরি করা হয়েছে এবং এটি number
এর মেমোরি ঠিকানা ধারণ করছে।*ptr
ব্যবহার করে number
এর মানকে অ্যাক্সেস করা হয়েছে, যা ডেরেফারেন্সিং (dereferencing) নামে পরিচিত।১. অ্যাড্রেস-অফ অপারেটর (&
): কোনো ভ্যারিয়েবলের ঠিকানা পেতে &
চিহ্ন ব্যবহার করা হয়।
int number = 10;
int *ptr = &number; // number এর ঠিকানা ptr এ রাখা হচ্ছে
২. ডেরেফারেন্স অপারেটর (*
): পয়েন্টার ব্যবহার করে কোনো মেমোরি ঠিকানার মান অ্যাক্সেস করতে *
অপারেটর ব্যবহার করা হয়।
cout << *ptr; // ptr এর নির্দেশিত ঠিকানার মান প্রিন্ট করবে
C++ এ পয়েন্টার এবং অ্যারে একসাথে ব্যবহৃত হতে পারে। একটি অ্যারের প্রথম উপাদানের ঠিকানাই হলো পুরো অ্যারের ঠিকানা, তাই অ্যারের নামই পয়েন্টার হিসেবে কাজ করে।
#include <iostream>
using namespace std;
int main() {
int numbers[3] = {10, 20, 30};
int *ptr = numbers; // numbers অ্যারের প্রথম উপাদানের ঠিকানা ptr এ রাখা হচ্ছে
for (int i = 0; i < 3; i++) {
cout << "Element " << i << ": " << *(ptr + i) << endl;
}
return 0;
}
বর্ণনা:
numbers
অ্যারে ব্যবহার করে প্রতিটি উপাদান পয়েন্টারের মাধ্যমে অ্যাক্সেস করা হয়েছে। *(ptr + i)
নির্দেশ করে যে প্রতিটি ইনডেক্সের মান পয়েন্টার ব্যবহার করে অ্যাক্সেস করা হচ্ছে।C++ এ new
এবং delete
কীওয়ার্ড ব্যবহার করে ডাইনামিক মেমোরি এলোকেশন করা হয়।
#include <iostream>
using namespace std;
int main() {
int *ptr = new int; // একটি পূর্ণসংখ্যার জন্য মেমোরি বরাদ্দ
*ptr = 100;
cout << "Value: " << *ptr << endl;
delete ptr; // মেমোরি মুক্ত করা
return 0;
}
বর্ণনা:
new
অপারেটর ব্যবহার করে একটি পূর্ণসংখ্যার জন্য মেমোরি বরাদ্দ করা হয়েছে এবং delete
অপারেটর ব্যবহার করে সেই মেমোরি মুক্ত করা হয়েছে।১. ড্যাংলিং পয়েন্টার: যখন একটি পয়েন্টার এমন একটি মেমোরি লোকেশনের দিকে নির্দেশ করে যা মেমোরি থেকে মুক্ত (deallocated) করা হয়েছে। ২. মেমোরি লিক: ডাইনামিক মেমোরি বরাদ্দ করার পর যদি তা মুক্ত না করা হয়, তাহলে মেমোরি লিকের সমস্যা দেখা দেয়। ৩. নাল পয়েন্টার: কোনো পয়েন্টারের প্রাথমিক মান হিসেবে NULL
অ্যাসাইন করা উচিত, যাতে এটি কোনো অবৈধ মেমোরি অ্যাক্সেস না করে।
int *ptr = NULL; // নাল পয়েন্টার
পয়েন্টার C++ এর মতো লো-লেভেল ভাষায় মেমোরি ব্যবস্থাপনা এবং পারফরম্যান্স বৃদ্ধি করতে অত্যন্ত কার্যকর একটি ফিচার।
common.read_more